home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 3.iso / dist / fw_qt3.idb / usr / freeware / Qt / examples / opengl / glpixmap / globjwin.cpp.z / globjwin.cpp
C/C++ Source or Header  |  2002-04-08  |  6KB  |  216 lines

  1. /****************************************************************************
  2. ** $Id:  qt/globjwin.cpp   3.0.3   edited Oct 12 12:18 $
  3. **
  4. ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
  5. **
  6. ** This file is part of an example program for Qt.  This example
  7. ** program may be used, distributed and modified without limitation.
  8. **
  9. *****************************************************************************/
  10.  
  11. /****************************************************************************
  12. **
  13. ** Implementation of GLObjectWindow widget class
  14. **
  15. ****************************************************************************/
  16.  
  17.  
  18. #include <qpushbutton.h>
  19. #include <qslider.h>
  20. #include <qlayout.h>
  21. #include <qframe.h>
  22. #include <qlabel.h>
  23. #include <qmenubar.h>
  24. #include <qpopupmenu.h>
  25. #include <qapplication.h>
  26. #include <qkeycode.h>
  27. #include <qpixmap.h>
  28. #include <qimage.h>
  29. #include <qpainter.h>
  30. #include "globjwin.h"
  31. #include "glbox.h"
  32.  
  33.  
  34. GLObjectWindow::GLObjectWindow( QWidget* parent, const char* name )
  35.     : QWidget( parent, name )
  36. {
  37.     // Create a menu
  38.     file = new QPopupMenu( this );
  39.     file->setCheckable( TRUE );
  40.     file->insertItem( "Grab Frame Buffer", this, SLOT(grabFrameBuffer()) );
  41.     file->insertItem( "Render Pixmap", this, SLOT(makePixmap()) );
  42.     file->insertItem( "Render Pixmap Hidden", this, SLOT(makePixmapHidden()) );
  43.     file->insertSeparator();
  44.     fixMenuItemId = file->insertItem( "Use Fixed Pixmap Size", this, 
  45.                       SLOT(useFixedPixmapSize()) );
  46.     file->insertSeparator();
  47.     insertMenuItemId = file->insertItem( "Insert Pixmap Here", this, 
  48.                      SLOT(makePixmapForMenu()) );
  49.     file->insertSeparator();
  50.     file->insertItem( "Exit",  qApp, SLOT(quit()), CTRL+Key_Q );
  51.  
  52.     // Create a menu bar
  53.     QMenuBar *m = new QMenuBar( this );
  54.     m->setSeparator( QMenuBar::InWindowsStyle );
  55.     m->insertItem("&File", file );
  56.  
  57.     // Create nice frames to put around the OpenGL widgets
  58.     QFrame* f1 = new QFrame( this, "frame1" );
  59.     f1->setFrameStyle( QFrame::Sunken | QFrame::Panel );
  60.     f1->setLineWidth( 2 );
  61.  
  62.     // Create an OpenGL widget
  63.     c1 = new GLBox( f1, "glbox1");
  64.  
  65.     // Create a label that can display the pixmap
  66.     lb = new QLabel( this, "pixlabel" );
  67.     lb->setFrameStyle( QFrame::Sunken | QFrame::Panel );
  68.     lb->setLineWidth( 2 );
  69.     lb->setAlignment( AlignCenter );
  70.     lb->setMargin( 0 );
  71.     lb->setIndent( 0 );
  72.  
  73.     // Create the three sliders; one for each rotation axis
  74.     QSlider* x = new QSlider ( 0, 360, 60, 0, QSlider::Vertical, this, "xsl" );
  75.     x->setTickmarks( QSlider::Left );
  76.     connect( x, SIGNAL(valueChanged(int)), c1, SLOT(setXRotation(int)) );
  77.  
  78.     QSlider* y = new QSlider ( 0, 360, 60, 0, QSlider::Vertical, this, "ysl" );
  79.     y->setTickmarks( QSlider::Left );
  80.     connect( y, SIGNAL(valueChanged(int)), c1, SLOT(setYRotation(int)) );
  81.  
  82.     QSlider* z = new QSlider ( 0, 360, 60, 0, QSlider::Vertical, this, "zsl" );
  83.     z->setTickmarks( QSlider::Left );
  84.     connect( z, SIGNAL(valueChanged(int)), c1, SLOT(setZRotation(int)) );
  85.  
  86.  
  87.     // Now that we have all the widgets, put them into a nice layout
  88.  
  89.     // Put the sliders on top of each other
  90.     QVBoxLayout* vlayout = new QVBoxLayout( 20, "vlayout");
  91.     vlayout->addWidget( x );
  92.     vlayout->addWidget( y );
  93.     vlayout->addWidget( z );
  94.  
  95.     // Put the GL widget inside the frame
  96.     QHBoxLayout* flayout1 = new QHBoxLayout( f1, 2, 2, "flayout1");
  97.     flayout1->addWidget( c1, 1 );
  98.  
  99.     // Top level layout, puts the sliders to the left of the frame/GL widget
  100.     QHBoxLayout* hlayout = new QHBoxLayout( this, 20, 20, "hlayout");
  101.     hlayout->setMenuBar( m );
  102.     hlayout->addLayout( vlayout );
  103.     hlayout->addWidget( f1, 1 );
  104.     hlayout->addWidget( lb, 1 );
  105.  
  106. }
  107.  
  108.  
  109.  
  110. void GLObjectWindow::grabFrameBuffer()
  111. {
  112.     QImage img = c1->grabFrameBuffer();
  113.  
  114.     // Convert image to pixmap so we can show it
  115.     QPixmap pm;
  116.     pm.convertFromImage( img, AvoidDither );
  117.     drawOnPixmap( &pm );
  118.     lb->setPixmap( pm );
  119. }
  120.  
  121.  
  122.  
  123. void GLObjectWindow::makePixmap()
  124. {
  125.     // Make a pixmap to to be rendered by the gl widget
  126.     QPixmap pm;
  127.  
  128.     // Render the pixmap, with either c1's size or the fixed size pmSz
  129.     if ( pmSz.isValid() )
  130.     pm = c1->renderPixmap( pmSz.width(), pmSz.height() );
  131.     else 
  132.     pm = c1->renderPixmap();
  133.  
  134.     if ( !pm.isNull() ) {
  135.     // Present the pixmap to the user
  136.     drawOnPixmap( &pm );
  137.     lb->setPixmap( pm );
  138.     }
  139.     else {
  140.     lb->setText( "Failed to render Pixmap." );
  141.     }
  142. }
  143.  
  144.  
  145. void GLObjectWindow::makePixmapHidden()
  146. {
  147.     // Make a QGLWidget to draw the pixmap. This widget will not be shown.
  148.     GLBox* w = new GLBox( this, "temporary glwidget", c1 );
  149.  
  150.     bool success = FALSE;
  151.     QPixmap pm;
  152.  
  153.     if ( w->isValid() ) {
  154.     // Set the current rotation
  155.     w->copyRotation( *c1 );
  156.  
  157.     // Determine wanted pixmap size
  158.     QSize sz = pmSz.isValid() ? pmSz : c1->size();
  159.  
  160.     // Make our hidden glwidget render the pixmap
  161.     pm = w->renderPixmap( sz.width(), sz.height() );
  162.  
  163.     if ( !pm.isNull() )
  164.         success = TRUE;
  165.     }
  166.  
  167.     if ( success ) {
  168.     // Present the pixmap to the user
  169.     drawOnPixmap( &pm );
  170.     lb->setPixmap( pm );
  171.     }
  172.     else {
  173.     lb->setText( "Failed to render Pixmap." );
  174.     }
  175.     delete w;
  176. }
  177.  
  178.  
  179. void GLObjectWindow::drawOnPixmap( QPixmap* pm )
  180. {
  181.     // Draw some text on the pixmap to differentiate it from the GL window
  182.  
  183.     if ( pm->isNull() ) {
  184.     qWarning("Cannot draw on null pixmap");
  185.     return;
  186.     }
  187.     else {
  188.     QPainter p( pm );
  189.        p.setFont( QFont( "Helvetica", 18 ) );
  190.     p.setPen( white );
  191.     p.drawText( pm->rect(), AlignCenter, "This is a Pixmap" );
  192.     }
  193. }
  194.  
  195.  
  196.  
  197. void GLObjectWindow::useFixedPixmapSize()
  198. {
  199.     if ( pmSz.isValid() ) {
  200.     pmSz = QSize();
  201.     file->setItemChecked( fixMenuItemId, FALSE );
  202.     }
  203.     else {
  204.     pmSz = QSize( 200, 200 );
  205.     file->setItemChecked( fixMenuItemId, TRUE );
  206.     }
  207. }
  208.  
  209.  
  210. void GLObjectWindow::makePixmapForMenu()
  211. {
  212.     QPixmap pm = c1->renderPixmap( 32, 32 );
  213.     if ( !pm.isNull() )
  214.     file->changeItem( pm, "Insert Pixmap Here", insertMenuItemId );
  215. }
  216.